/* UTF8 Encoding */
/*-----------------------------------------------------------------------
|                            FILE DESCRIPTION                           |
-----------------------------------------------------------------------*/
/*----------------------------------------------------------------------
  - File name     : dcdc.hpp
  - Author        : liuzhihua (liuzhihuawy@163.com)
  - Update date   : 2024.06.01
  - Brief         : dcdc app
  - Version       : v0.1
-----------------------------------------------------------------------*/
/*-----------------------------------------------------------------------
|                               UPDATE NOTE                             |
-----------------------------------------------------------------------*/
/**
  * Update note:
  * ------------   ---------------   ----------------------------------
  *     Date            Author                      Note
  * ------------   ---------------   ----------------------------------
  *  2024.06.01       liuzhihua                  Create file          
***/

#ifndef DCDC_HPP
#define DCDC_HPP

/*-----------------------------------------------------------------------
|                               INCLUDES                                |
-----------------------------------------------------------------------*/
#include <stdint.h>
#include "pid.h"
#include "dcdc_config.h"

/*-----------------------------------------------------------------------
|                                DEFINES                                |
-----------------------------------------------------------------------*/

class dcdcPower
{
    public:
        typedef enum {
            // 开环降压
            MODE_BUCK_OPEN = 0,
            // 闭环降压
            MODE_BUCK_FEEDBACK,
            // 开环升压
            MODE_BOOST_OPEN,
            // 闭环升压
            MODE_BOOST_FEEDBACK
        }power_mode_e;

        typedef enum {
            //等待状态
            STATE_WAIT = 0,
            //空闲
            STATE_IDLE,
            //初始化
            STATE_INIT,
            //运行状态
            STATE_RUN,
            //停机
            STATE_STOP,
            //错误
            STATE_ERROR
        }power_state_e;

    private:
        power_mode_e mode;
        // 状态机当前状态
        power_state_e state;
        // 子状态，休眠完成后赋值
        uint8_t sub_state;
        uint8_t sub_state_shadow;
        // 状态时间
        uint32_t time;
        // 超时时间
        uint32_t timeout;
        // 休眠时间
        uint32_t sleep_time;

        bool sleep(uint32_t ms, uint8_t subState);
        bool sleep(uint32_t ms);
        bool awake(void);
        bool awake(uint8_t subState);
        static void wake_task(const void * arg);
        void run(void);

    public:
        // 等待超时时间
        uint32_t timeout_wait;
        // 高侧死区时间
        uint16_t dead_time_high;
        // 低侧死区时间
        uint16_t dead_time_low;
        // 高侧占空比
        uint16_t duty_high;
        // 低侧占空比
        uint16_t duty_low;
        // 软起动时间ms
        uint32_t soft_start_time;
        // // 软起动步进时间
        // uint16_t soft_start_stepTime;
        // 高侧软起动初始频率Hz
        uint32_t soft_start_initFreq_HV;
        // 高侧软起动目标频率Hz
        uint32_t soft_start_targetFreq_HV;
        // 低侧软起动初始频率Hz
        uint32_t soft_start_initFreq_LV;
        // 低侧软起动目标频率Hz
        uint32_t soft_start_targetFreq_LV;
        // 软起动频率步进Hz
        int soft_start_stepFreq;
        // 软起动当前频率Hz
        uint32_t soft_start_currentFreq;
        

        /* 外部接口 */
        // 构造函数
        dcdcPower(void);
        // 启动状态机
        void start(power_mode_e Mode);
        // 停止状态机
        void stop(void);
        // 检查工作条件
        bool check_work_condition(void);
        // // PWM设置
        // void pwm_set_freq(uint32_t Frequnce);
        // void pwm_set_duty(uint32_t Duty);
        // void pwm_set_dead(uint32_t DeadTime);
        // void pwm_start(void);
        // void pwm_stop(void);
        // MOS驱动控制
        // void mos_enable(void);
        // void mos_disable(void);

        /* 风扇 */
        uint8_t fanSpeedAuto_flag;
        static void fan_serve(const void *arg);
        void fan_auto_start(void);
        void fan_auto_stop(void);
        void set_fan_speed(uint8_t id, uint16_t speed);
        void fan_init(void);
        /*     同步整流     */

        // 同步整流标志
        uint8_t SR_flag;
        // 触发延时
        uint32_t SR_L_Rise_delay;
        /* 安全守护 */     
        // 安全守护标志
        uint8_t safe_guard_flag;
        void safe_guard_serve(void);

        /*    闭环控制部分    */
        // 高侧电压
        float V_h;
        // 高侧电流
        float I_h;
        // 低侧电压
        float V_l;
        // 低侧电流
        float I_l;
        // 目标电压
        float V_target;
        // 目标电流
        float I_target;
        // 当前输出频率
        float F_current;

        // 升压电压环
        pid_inc_t pid_boost_V;
        // 升压电流环
        pid_inc_t pid_boost_I;
        // 降压电压环
        pid_inc_t pid_buck_V;
        // 降压电流环
        pid_inc_t pid_buck_I;
        
        // 刷新输入数据
        void reflash_input(void);
        // 参数初始化
        void feedback_param_init(void);
        // 启动升压闭环控制
        void feedback_boost_start(void);
        // 关闭升压闭环控制
        void feedback_boost_stop(void);
        // 启动降压闭环控制
        void feedback_buck_start(void);
        // 关闭降压闭环控制
        void feedback_buck_stop(void);
        
        // 降压控制循环
        void buck_regulator_loop(void);
        // 升压控制循环
        void boost_regulator_loop(void);
        void ex_regulator_serve(void);
        // 设置闭环降压的电压
        void set_buck_voltage(float valtage);
};
/*-----------------------------------------------------------------------
|                                  API                                  |
-----------------------------------------------------------------------*/
extern dcdcPower dcpower;

#ifdef  __cplusplus
    extern "C" {
#endif


#ifdef __cplusplus
	}
#endif
#endif
